package com.ys.day27.p2阻塞队列;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;

/**
 * 描述: 带有缓冲区的队列，该队列最多只能放入一个元素，它通常在多线程环境下使用。
 *  只能再多线程下使用,单线程使用会报错
 *
 * @author CodeYang
 * @version 2021/1/6 20:04
 */
public class P2SynchronousQueue带有缓冲区的队列 {

    public static void main(String[] args) {
        /**
         * 该队列只能容纳一个元素，它的核心是一个生产者消费者模式 (不完全是 单生产者消费者模式)
         * 生产者调用put()方法将元素放入容器，如果消费者没有拿走，此时会一直阻塞。
         * SynchronousQueue作为一个共享资源，多个线程使用，生产者线程put10个元素，消费者线程take10个元素。
         */
        BlockingQueue<Integer> queue = new SynchronousQueue();
        try {
            queue.put(1);
            /**
             * } else if (casHead(h, s = snode(s, e, h, mode))) {
             *                         SNode m = awaitFulfill(s, timed, nanos);
             *                         底层有一个 Lock级别的锁
             *
             * 判断,我们已经放入了元素 就 wait 然后等待 消费者线程拿走
             */
            Integer num = queue.take();
            System.out.println(num);
            System.out.println(queue.size());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
